package dejava.bolsadetrabajo.repository.jdbc;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import dejava.bolsadetrabajo.repository.BolsaRepository;
import dejava.bolsadetrabajo.repository.model.Aviso;
import dejava.bolsadetrabajo.repository.model.Ranking;


public class BolsaRepositoryJdbc implements BolsaRepository {

	@Override
	public List<Aviso> obtenerOfertasPorFechaPublicacion(String fechaPublicacion)
			throws Exception {
		List<Aviso> avisos = new ArrayList<Aviso>();

		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;

		String sql = "";
		sql += "{ call sp_obtenerOfertasxPorFechaPublicacion(?) }";

		try {
			Class.forName("com.mysql.jdbc.Driver").newInstance();
			conn = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/bolsatrabajo", "root", "123");

			CallableStatement prcProcedimientoAlmacenado = conn
					.prepareCall(sql);
			prcProcedimientoAlmacenado.setString(1, fechaPublicacion);
			rs = prcProcedimientoAlmacenado.executeQuery();

			while (rs.next()) {
				Aviso aviso = new Aviso();
				aviso.setIdAviso(rs.getInt("idAviso"));
				aviso.setDescripcion(rs.getString("descripcion"));
				aviso.setPuesto(rs.getString("puesto"));
				aviso.setCondicion(rs.getString("condicion"));
				aviso.setFechaPublicacion(rs.getString("fechaPublicacion"));
				aviso.setFechaVencimiento(rs.getString("fechaVencimiento"));
				aviso.setEspecialidad(rs.getString("especialidad"));
				aviso.setIndustria(rs.getString("industria"));
				aviso.setDepartamento(rs.getString("departamento"));
				avisos.add(aviso);

			}
		} catch (Exception except) {
			SQLException ex = new SQLException(
					"Error Establishing Connection: " + except.getMessage());
			throw ex;
		} finally {
			if (rs != null) {
				try {
					// Close to prevent database cursor exhaustion
					rs.close();
				} catch (SQLException ex) {
				}
			}
			if (ps != null) {
				try {
					// Close to prevent database cursor exhaustion
					ps.close();
				} catch (SQLException ex) {
				}
			}
			if (conn != null) {
				try {
					// Close to prevent database connection exhaustion
					conn.close();
				} catch (SQLException ex) {
				}
			}
		}

		return avisos;
	}

	@Override
	public List<Aviso> obtenerDetalleAviso(int _IdAviso) throws SQLException {
		List<Aviso> avisos = new ArrayList<Aviso>();

		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;

		String sql = "";
		sql += "SELECT a.idAviso,a.descripcion,a.puesto,a.condicion,a.fechaPublicacion,a.fechaVencimiento,";
		sql += "d.nombre as departamento ,e.nombre as especialidad,i.nombre  as industria ";
		sql += "FROM aviso a INNER JOIN departamento d ON a.idDepartamento=d.idDepartamento ";
		sql += "INNER JOIN especialidad e ON a.idEspecialidad=e.idEspecialidad ";
		sql += "INNER JOIN industria i ON a.idIndustria=i.idIndustria ";
		sql += "WHERE A.IDAVISO=?";

		try {
			Class.forName("com.mysql.jdbc.Driver").newInstance();
			conn = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/bolsatrabajo", "root", "ojbo");

			ps = conn.prepareStatement(sql);
			ps.setInt(1, _IdAviso);
			rs = ps.executeQuery();

			while (rs.next()) {
				Aviso aviso = new Aviso();
				aviso.setIdAviso(rs.getInt("idAviso"));
				aviso.setDescripcion(rs.getString("descripcion"));
				aviso.setPuesto(rs.getString("puesto"));
				aviso.setCondicion(rs.getString("condicion"));
				aviso.setFechaPublicacion(rs.getString("fechaPublicacion"));
				aviso.setFechaVencimiento(rs.getString("fechaVencimiento"));
				aviso.setEspecialidad(rs.getString("especialidad"));
				aviso.setIndustria(rs.getString("industria"));
				aviso.setDepartamento(rs.getString("departamento"));
				avisos.add(aviso);

			}
		} catch (Exception except) {
			SQLException ex = new SQLException(
					"Error Establishing Connection: " + except.getMessage());
			throw ex;
		} finally {
			if (rs != null) {
				try {
					// Close to prevent database cursor exhaustion
					rs.close();
				} catch (SQLException ex) {
				}
			}
			if (ps != null) {
				try {
					// Close to prevent database cursor exhaustion
					ps.close();
				} catch (SQLException ex) {
				}
			}
			if (conn != null) {
				try {
					// Close to prevent database connection exhaustion
					conn.close();
				} catch (SQLException ex) {
				}
			}
		}

		return avisos;

	}

	@Override
	public List<Aviso> obtenerOfertasPorDestacadasoPorTodas(String tipoOferta)
			throws Exception {
		List<Aviso> avisos = new ArrayList<Aviso>();

		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;

		String sql = "";
		sql += "{ call sp_obtenerOfertasPorDestacadasoPorTodas(?) }";

		try {
			Class.forName("com.mysql.jdbc.Driver").newInstance();
			conn = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/bolsatrabajo", "root", "ojbo");

			CallableStatement prcProcedimientoAlmacenado = conn
					.prepareCall(sql);
			prcProcedimientoAlmacenado.setString(1, tipoOferta);
			rs = prcProcedimientoAlmacenado.executeQuery();

			while (rs.next()) {
				Aviso aviso = new Aviso();
				aviso.setIdAviso(rs.getInt("idAviso"));
				aviso.setDescripcion(rs.getString("descripcion"));
				aviso.setPuesto(rs.getString("puesto"));
				aviso.setCondicion(rs.getString("condicion"));
				aviso.setFechaPublicacion(rs.getString("fechaPublicacion"));
				aviso.setFechaVencimiento(rs.getString("fechaVencimiento"));
				aviso.setEspecialidad(rs.getString("especialidad"));
				aviso.setIndustria(rs.getString("industria"));
				aviso.setDepartamento(rs.getString("departamento"));
				avisos.add(aviso);

			}
		} catch (Exception except) {
			SQLException ex = new SQLException(
					"Error Establishing Connection: " + except.getMessage());
			throw ex;
		} finally {
			if (rs != null) {
				try {
					// Close to prevent database cursor exhaustion
					rs.close();
				} catch (SQLException ex) {
				}
			}
			if (ps != null) {
				try {
					// Close to prevent database cursor exhaustion
					ps.close();
				} catch (SQLException ex) {
				}
			}
			if (conn != null) {
				try {
					// Close to prevent database connection exhaustion
					conn.close();
				} catch (SQLException ex) {
				}
			}
		}

		return avisos;

	}

	@Override
	public List<Ranking> ObtenerOfertasPorIndustria() throws SQLException {
		List<Ranking> rankings = new ArrayList<Ranking>();

		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;

		String sql = "";
		sql += "{ call sp_obtenerOfertasxIndustria() }";

		try {
			Class.forName("com.mysql.jdbc.Driver").newInstance();
			conn = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/bolsatrabajo", "root", "ojbo");

			CallableStatement prcProcedimientoAlmacenado = conn
					.prepareCall(sql);
			rs = prcProcedimientoAlmacenado.executeQuery();

			while (rs.next()) {
				Ranking ranking = new Ranking();
				ranking.setIdEspecialidad(rs.getInt("idIndustria"));
				ranking.setNombre(rs.getString("nombre"));
				ranking.setRanking(rs.getInt("nOfertas"));
				rankings.add(ranking);
			}
		} catch (Exception except) {
			SQLException ex = new SQLException(
					"Error Establishing Connection: " + except.getMessage());
			throw ex;
		} finally {
			if (rs != null) {
				try {
					// Close to prevent database cursor exhaustion
					rs.close();
				} catch (SQLException ex) {
				}
			}
			if (ps != null) {
				try {
					// Close to prevent database cursor exhaustion
					ps.close();
				} catch (SQLException ex) {
				}
			}
			if (conn != null) {
				try {
					// Close to prevent database connection exhaustion
					conn.close();
				} catch (SQLException ex) {
				}
			}
		}

		return rankings;

	}

	@Override
	public List<Ranking> ObtenerOfertasPorEspecialidad() throws Exception {
		List<Ranking> rankings = new ArrayList<Ranking>();

		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;

		String sql = "";
		sql += "{ call sp_obtenerOfertasxEspecialidad() }";

		try {

			// Class.forName("com.mysql.jdbc.Driver").newInstance();
			conn = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/bolsatrabajo", "root", "ojbo");

			CallableStatement prcProcedimientoAlmacenado = conn
					.prepareCall(sql);
			rs = prcProcedimientoAlmacenado.executeQuery();

			while (rs.next()) {
				Ranking ranking = new Ranking();
				ranking.setIdEspecialidad(rs.getInt("idEspecialidad"));
				ranking.setNombre(rs.getString("nombre"));
				ranking.setRanking(rs.getInt("nOfertas"));
				rankings.add(ranking);
			}

		} catch (Exception except) {
			SQLException ex = new SQLException(
					"Error Establishing Connection: " + except.getMessage());
			throw ex;
		} finally {
			if (rs != null) {
				try {
					// Close to prevent database cursor exhaustion
					rs.close();
				} catch (SQLException ex) {
				}
			}
			if (ps != null) {
				try {
					// Close to prevent database cursor exhaustion
					ps.close();
				} catch (SQLException ex) {
				}
			}
			if (conn != null) {
				try {
					// Close to prevent database connection exhaustion
					conn.close();
				} catch (SQLException ex) {
				}
			}
		}

		return rankings;
	}
}
